﻿using System;
using System.Collections.Generic;
using System.Linq;
using Joel.Vishnu.Modelo.Entidades;
using Joel.Vishnu.Modelo.Enumeradores;
using Joel.Vishnu.Presentacion.Vistas;
using Joel.Vishnu.Presentacion;
using Joel.Vishnu.Modelo.Objetos;

namespace Joel.Vishnu.Consola
{
    public class Barrios : Base, IBarrios
    {
        #region Constructores

        public Barrios()
            : base()
        {
            presentador = new BarriosPresentador(this);
            listaBarrios = new List<Barrio>();
            validador = String.Empty;
        }

        #endregion

        #region Atributos

        private BarriosPresentador presentador;
        private EnumEstado estado;
        private Int32 barrioId;
        private String nombre;
        private List<Barrio> listaBarrios;
        private String validador;

        #endregion

        #region Propiedades

        public int BarrioId
        {
            get { return barrioId; }
        }

        public string Nombre
        {
            get { return nombre; ; }
        }

        public EnumEstado Estado
        {
            get { return estado; }
        }

        public List<Barrio> ListaBarrios
        {
            set { listaBarrios = value; }
        }

        #endregion

        #region Metodos

        public String Menu(EnumMenus estado)
        {
            Console.Clear();
            Titulo("********** Barrios **********");
            MensajeInformativo("(1) Agregar");
            MensajeInformativo("(2) Modificar");
            MensajeInformativo("(3) Eliminar");
            MensajeInformativo("(4) Listado");
            Console.WriteLine();
            switch (estado)
            {
                case EnumMenus.CLIENTES:
                    MensajeInformativo("(0) Menú clientes");
                    break;
                case EnumMenus.EMPLEADOS:
                    MensajeInformativo("(0) Menú empleados");
                    break;
            }
            Console.WriteLine();
            MensajeInformativo("Presione el número de la opción deseada.");
            return Console.ReadKey().KeyChar.ToString();
        }

        public void Insertar()
        {
            try
            {
                Console.Clear();
                Titulo("********** Agregar barrio **********");
                MensajeInformativoSeguido("Nombre: ");
                nombre = Console.ReadLine();
                estado = EnumEstado.NUEVO;
                presentador.Aceptar();
                Console.WriteLine();
                MensajeInformativoSeguido("Barrio ingresado.");
                Console.ReadKey();
            }
            catch (Exception ex)
            {
                MensajeError(ex.Message);
            }
        }

        public void Modificar()
        {
            try
            {
                String textoIngresado = String.Empty;
                Barrio barrio = new Barrio();

                Console.Clear();
                Titulo("********** Modificar barrio **********");
                MostrarBarrios();
                Console.WriteLine();
                MensajeInformativoSeguido("Seleccione Id: ");
                validador = Console.ReadLine();

                if(Validadores.ValidadorEnteros(validador) == false || listaBarrios.Where(x => x.Id == Convert.ToInt32(validador)).FirstOrDefault() == null)
                    throw new Exception("Debe seleccionar un barrio de la lista.");
                barrioId = Convert.ToInt32(validador);

                if (barrioId == (Int32)EnumBarrios.BARRIO_POR_DEFECTO)
                    throw new Exception("No se puede modificar un barrio por defecto.");
                barrio = listaBarrios.Where(x => x.Id == barrioId).FirstOrDefault();

                MensajeInformativoSeguido("Nombre: ");
                textoIngresado = Console.ReadLine();
                if (textoIngresado != "=")
                    nombre = textoIngresado;
                else
                    nombre = barrio.Nombre;

                estado = EnumEstado.MODIFICAR;
                presentador.Aceptar();
                Console.WriteLine();
                MensajeInformativoSeguido("Barrio modificado.");
                Console.ReadKey();
            }
            catch (Exception ex)
            {
                MensajeError(ex.Message);
            }
        }

        public void Eliminar()
        {
            try
            {
                Console.Clear();
                Titulo("********** Eliminar barrio **********");
                MostrarBarrios();
                Console.WriteLine();
                MensajeInformativoSeguido("Seleccione Id: ");
                validador = Console.ReadLine();

                if (Validadores.ValidadorEnteros(validador) == false || listaBarrios.Where(x => x.Id == Convert.ToInt32(validador)).FirstOrDefault() == null)
                    throw new Exception("Debe seleccionar un barrio de la lista.");
                barrioId = Convert.ToInt32(validador);

                if (barrioId == (Int32)EnumBarrios.BARRIO_POR_DEFECTO)
                    throw new Exception("No se puede eliminar un barrio por defecto.");

                presentador.Eliminar();
                Console.WriteLine();
                MensajeInformativoSeguido("Barrio eliminado.");
                Console.ReadKey();
            }
            catch (Exception ex)
            {
                MensajeError(ex.Message);
            }
        }

        public void Listado()
        {
            try
            {
                Console.Clear();
                Titulo("********** Listado de barrios **********");
                MostrarBarrios();
                Console.ReadKey();
            }
            catch (Exception ex)
            {
                MensajeError(ex.Message);
            }
        }

        public void MostrarBarrios()
        {
            MensajeInformativo(String.Format("{0} {1}",
                ArmarLineaInversa("Id", 3),
                ArmarLinea("Nombre", 15)));
            presentador.ActualizarBarrios();
            foreach (var item in listaBarrios)
                Console.WriteLine(String.Format("{0} {1}",
                    ArmarLineaInversa(Convert.ToString(item.Id), 3),
                    ArmarLinea(item.Nombre, 15)));
        }

        #endregion
    }
}
